﻿// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动！任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任！

using System.ComponentModel;

namespace Admin.NET.Application.Service.PlanViews.Dto;

/// <summary>
/// 周期统计请求（用于统计图聚合，非甘特）
/// </summary>
public sealed class CycleSummaryRequest
{
    public CycleCommonFilters Filters { get; set; } = new();
    public TimeFieldMode TimeField { get; set; } = TimeFieldMode.Both;
    public TimeMatchMode TimeMatch { get; set; } = TimeMatchMode.Intersects;

    // 维度（用于分组），建议与树形一致
    public List<string> Dims { get; set; } = new();

    // 根层分页
    public int PageIndex { get; set; } = 1;
    public int PageSize { get; set; } = 50;

    // 目标路径（若仅需要指定某个分组的聚合+明细）
    public List<string>? TargetKeyPath { get; set; }
}

public sealed class CycleSummaryRow
{
    public string Id { get; set; } = string.Empty;         // keyPath 拼接
    public List<string> KeyPath { get; set; } = new();
    public string Label { get; set; } = string.Empty;       // 展示名（最后一级）
    public List<string> DisplayKeyPath { get; set; } = new(); // 友好名的路径（与 Dims 顺序一致）
    public string? DisplayLabel { get; set; }                 // 友好名（最后一级）

    // 聚合指标（天）
    public double? ActualWorkDays { get; set; }             // 合并后的实际工作时长
    public double? IdleGapDays { get; set; }                // 相邻区间空挡之和
    public double? FullCycleDays { get; set; }              // 最小开始-最大结束跨度（优先实际，回退计划）
    public double? PlanCycleAvgDays { get; set; }           // 平均计划周期（按任务粒度）
    public double? ActualCycleAvgDays { get; set; }         // 平均实际周期（按任务粒度）
    public double? PlanCycleSumDays { get; set; }           // 合计计划周期（按任务粒度求和）
    public double? ActualCycleSumDays { get; set; }         // 合计实际周期（按任务粒度求和）
    public double? PlanSpanDays { get; set; }               // 最小计划-最大计划跨度
    public double? ActualSpanDays { get; set; }             // 最小实际-最大实际跨度

    public int ItemCount { get; set; }
    public int CompletedCount { get; set; }
    public int InProgressCount { get; set; }
}

public sealed class CycleSummaryResponse
{
    public List<CycleSummaryRow> Rows { get; set; } = new();
    public int Total { get; set; }
    public int PageIndex { get; set; }
    public int PageSize { get; set; }
}
